package com.gitee.zhuyb.util;

import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFChart;

import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0.0
 * @Description: 刷新word文档中图表excel数据表格
 * @Date: 2021/12/26 15:23
 * @Copyright (C) ZhuYouBin
 */
public class ExcelUtil {


    /**
     * 刷新excel数据表格
     * @param chart 图表对象【柱状图、折线图、饼状图、雷达图等等】
     * @param firstRowTitle excel表格第一行的数据名称
     * @param firstColTitle excel表格每一列的数据名称【用于map获取数据】
     * @param rowDataList excel每行需要填充的数据
     * @return
     */
    public static boolean refreshExcel(XWPFChart chart,
                                       List<String> firstRowTitle,
                                       List<String> firstColTitle,
                                       List<Map<String, String>> rowDataList) {
        // 刷新成功标识
        boolean refresh = true;
        // 1、创建worksheet工作簿和sheet页
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Sheet1");

        // 2、填充excel表格的第一行标题数据
        for (int i = 0; i < firstRowTitle.size(); i++) {
            String rowValue = firstRowTitle.get(i);
            // 获取数据表格第一行
            XSSFRow firstRow = sheet.getRow(0);
            if (firstRow == null) {
                // 第一行不存在,则创建新行
                sheet.createRow(0)
                        .createCell(i)
                        .setCellValue(rowValue == null ? "" : rowValue);
            } else {
                // 第一行存在,覆盖旧值
                firstRow.createCell(i)
                        .setCellValue(rowValue == null ? "" : rowValue);
            }
        }

        // 3、第二行开始填充每一行的excel表格数据
        for (int i = 0; i < rowDataList.size(); i++) {
            // 获取数据行
            Map<String, String> dataMap = rowDataList.get(i);
            // 遍历firstColTitle集合,获取对应的单元格的值
            for (int j = 0; j < firstColTitle.size(); j++) {
                // 获取的前列数据
                String colData = dataMap.get(firstColTitle.get(j));
                if (colData == null) {
                    colData = "0";
                }
                // 从第二行开始填充表格行数据
                XSSFRow currentRow = sheet.getRow(i + 1);
                if (currentRow == null) {
                    // 表格行不存在,则创建新的表格行
                    // 第一列默认是字符串,所以只需要执行一次
                    if (j == 0) {
                        sheet.createRow(i+1).createCell(j).setCellValue(colData);
                    }
                } else {
                    // 表格行存在,则填充每一列数据,图表数据一般是数值,所以转换成BigDecimal
                    BigDecimal decimal = new BigDecimal(colData);
                    currentRow.createCell(j).setCellValue(decimal+"");
                }
            }
        }

        // 4、更新图表中的excel数据表格
        POIXMLDocumentPart excelPart = chart.getRelations().get(0);
        OutputStream excelOut = excelPart.getPackagePart().getOutputStream();
        try {
            workbook.write(excelOut);
            excelOut.close();
        } catch (Exception e) {
            e.printStackTrace();
            refresh = false;
        } finally {
            if (null != workbook) {
                try {
                    workbook.close();
                } catch (Exception e) {
                    e.printStackTrace();
                    refresh = false;
                }
            }
        }
        return refresh;
    }

}
